package com.example.xuanke.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.xuanke.Entity.StudentCourseEntity;
import com.example.xuanke.commton.WrapMapper;
import com.example.xuanke.commton.Wrapper;
import com.example.xuanke.mapper.StudentCourseMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class StudentCourseSerivce {
    @Autowired
    private StudentCourseMapper studentCourseMapper;
    
    /**
     * 学生选课，每个学生最多选择三门课程
     * @param studentNo 学生学号
     * @param courseId 课程ID
     * @return 选课结果
     */
    public Wrapper<Boolean> studentCourseAdd(String studentNo, Long courseId) {
        if (studentNo == null || courseId == null) {
            return new Wrapper<>(500, "学号或课程ID不能为空", false);
        }
        
        try {
            // 查询该学生已选课程数量
            QueryWrapper<StudentCourseEntity> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("student_no", studentNo);
            int count = Math.toIntExact(studentCourseMapper.selectCount(queryWrapper));
            
            // 检查是否已达到最大选课数量(3门)
            if (count >= 3) {
                return new Wrapper<>(500, "选课失败：每个学生最多只能选择3门课程", false);
            }
            
            // 检查是否已经选过该课程
            queryWrapper.clear();
            queryWrapper.eq("student_no", studentNo).eq("course_id", courseId);
            int exists = Math.toIntExact(studentCourseMapper.selectCount(queryWrapper));
            if (exists > 0) {
                return new Wrapper<>(500, "选课失败：已经选过该课程", false);
            }
            
            // 创建选课记录
            StudentCourseEntity studentCourse = new StudentCourseEntity();
            studentCourse.setStudentNo(studentNo);
            studentCourse.setCourseId(courseId);
            studentCourse.setCreateTime(LocalDateTime.now());
            
            // 保存选课记录
            int result = studentCourseMapper.insert(studentCourse);
            
            if (result > 0) {
                return WrapMapper.ok(true);
            } else {
                return new Wrapper<>(500, "选课失败：数据库操作错误", false);
            }
        } catch (Exception e) {
            return new Wrapper<>(500, "选课失败：" + e.getMessage(), false);
        }
    }

    /**
     * 学生退课功能
     * @param studentNo 学生学号
     * @param courseId 课程ID
     * @return 退课结果
     */
    public Wrapper<Boolean> studentCourseDelete(String studentNo, Long courseId) {
        if (studentNo == null || courseId == null) {
            return new Wrapper<>(500, "学号或课程ID不能为空", false);
        }
        
        try {
            // 检查是否已经选过该课程
            QueryWrapper<StudentCourseEntity> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("student_no", studentNo).eq("course_id", courseId);
            int count = Math.toIntExact(studentCourseMapper.selectCount(queryWrapper));
            
            // 如果没有选过该课程，无法退课
            if (count == 0) {
                return new Wrapper<>(500, "退课失败：未选修该课程", false);
            }
            
            // 删除选课记录
            int result = studentCourseMapper.delete(queryWrapper);
            
            if (result > 0) {
                return WrapMapper.ok(true);
            } else {
                return new Wrapper<>(500, "退课失败：数据库操作错误", false);
            }
        } catch (Exception e) {
            return new Wrapper<>(500, "退课失败：" + e.getMessage(), false);
        }
    }

    /**
     * 查询学生已选课程
     * @param studentNo 学生学号
     * @return 已选课程列表
     */
    public Wrapper<?> getStudentCourses(String studentNo) {
        if (studentNo == null) {
            return new Wrapper<>(500, "学号不能为空", null);
        }
        
        try {
            // 查询该学生的所有选课记录
            QueryWrapper<StudentCourseEntity> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("student_no", studentNo);
            List<StudentCourseEntity> courseList = studentCourseMapper.selectList(queryWrapper);
            
            // 如果需要返回更详细的课程信息，可以进一步查询课程表
            // 这里需要根据实际情况修改，可能需要添加一个方法来获取课程详情
            // 例如：List<CourseDetailVO> detailList = getCourseDetails(courseList);
            
            return WrapMapper.ok(courseList);
        } catch (Exception e) {
            return new Wrapper<>(500, "查询已选课程失败：" + e.getMessage(), null);
        }
    }
}
